package com.haiwei.poi.word.poi;

import com.haiwei.poi.word.manager.HaiweiPatternUtil;
import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.util.List;

/**
 * POI XWPFRun 操作类.
 *
 * @date: 2022-06-25
 * @version: 1.0
 * @author: karry@haiwei.com
 */
public class HaiweiXWPFRunUtil {
    
    /**
     * 合并段落中多个RUN
     * 处理：占位符 被多个run分散的场景
     * 数组： AA BB ##{ Customer1 . Name } CC
     * @param lastRunText
     * @param i
     * @param runs
     * @return  最后一个run
     */
    public static int mergeRun(String lastRunText, int i, List<XWPFRun> runs){
        int spanRunNums = 0;
        int j = i + 1;
        int runNums = runs.size();
        StringBuilder sb = new StringBuilder(lastRunText);
        // 挨个往后处理
        for(; j < runNums; j++){
            XWPFRun run = runs.get(j);
            // 拼接文本
            sb.append(run.text());
            /**
             *  组装的字符串，匹配替换格式，则结束
             *  将后边的字符串放在第一个run中，也就是说按照第一个run的格式来输出
             */
            if(HaiweiPatternUtil.containPlaceHolder(sb.toString())){
                runs.get(i).setText(sb.toString(),0);
                spanRunNums = j - i;
                break;
            }
        }
        // 将后边的run清空，如果spanRunNums为空说明可能是##，##{这类字符，而不是完整的占位符
        if(spanRunNums > 0){
            for(int idx = i + 1; idx <= i+spanRunNums; idx++ ){
                XWPFRun run = runs.get(idx);
                run.setText("",0);
            }
        }
        return j;
    }
    
    /**
     * 给XWPFRun添加文本
     * @param run
     * @param text
     */
    public static void fillXWPFRunContent(XWPFRun run, String text) {
        if (text.contains("\n")) {
            String[] arrayContent = text.split("\n");
            for (int i = 0; i < arrayContent.length; i++) {
                String content = arrayContent[i];
                if (i == 0) {
                    run.setText(content, 0);
                    run.addBreak(BreakType.TEXT_WRAPPING);
                    continue;
                } else if (i != arrayContent.length - 1) {
                    run.setText(content);
                    run.addBreak(BreakType.TEXT_WRAPPING);
                } else {
                    run.setText(content);
                }
            }
        } else {
            run.setText(text, 0);
        }
    }
}
